home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / dev / misc / dialoglib.lha / checkbox.c < prev    next >
C/C++ Source or Header  |  1993-03-07  |  6KB  |  238 lines

  1. #include <intuition/gadgetclass.h>
  2. #include <libraries/gadtools.h>
  3. #include <graphics/text.h>
  4. #include <proto/diskfont.h>
  5. #include <proto/gadtools.h>
  6. #include <proto/graphics.h>
  7. #include <proto/utility.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. #include "dialog.h"
  11. #ifdef DEBUG1
  12.     #include <stdio.h>
  13. #endif
  14.  
  15. static ULONG getCheckBoxStructure( DialogElement *de )
  16. {
  17.     ULONG place, structure;
  18.  
  19.     if( !de )
  20.         return 0;
  21.  
  22.     if( GetTagData( NGDA_GadgetText, 0, de->taglist ) )
  23.     {
  24.         place = getTextPlacement( GetTagData( NGDA_Flags, 0, de->taglist ), PLACETEXT_LEFT );
  25.         switch( place )
  26.         {
  27.         case PLACETEXT_LEFT:
  28.         case PLACETEXT_RIGHT:
  29.             structure = DESF_VBaseline;
  30.             break;
  31.         case PLACETEXT_ABOVE:
  32.         case PLACETEXT_BELOW:
  33.             structure = DESF_HBaseline;
  34.             break;
  35.         }
  36.     }
  37.     return structure;
  38. }
  39.  
  40. static VOID setupCheckBox( DialogElement *de )
  41. {
  42.     struct TextAttr *ta;
  43.     struct TextFont *tf;
  44.     struct RastPort rp;
  45.     struct TextExtent te;
  46.     STRPTR text;
  47.     LONG width, height, textwidth, textheight;
  48.     ULONG place;
  49.  
  50.     if( !de )
  51.         return;
  52.  
  53.     de->idcmp_mask |= CHECKBOXIDCMP | IDCMP_REFRESHWINDOW | IDCMP_VANILLAKEY;
  54.  
  55.     ta = (struct TextAttr *)GetTagData( NGDA_TextAttr, 0, de->taglist );
  56.     if( !ta )
  57.         return;
  58.     tf = OpenDiskFont( ta );
  59.     if( !tf )
  60.         return;
  61.     InitRastPort( &rp );
  62.     SetFont( &rp, tf );
  63.  
  64.     text = (STRPTR)GetTagData( NGDA_GadgetText, 0, de->taglist );
  65.     if( text )
  66.         TextExtent( &rp, text, strlen( text ), &te );
  67.     else
  68.     {
  69.         te.te_Extent.MinX = te.te_Extent.MinY = 0;
  70.         te.te_Extent.MaxX = te.te_Extent.MaxY = -1;
  71.     }
  72.     textwidth = te.te_Extent.MaxX + 1 - te.te_Extent.MinX;
  73.     textheight = te.te_Extent.MaxY + 1 - te.te_Extent.MinY;
  74.  
  75.     CloseFont( tf );
  76.  
  77.     width = 26;
  78.     height = 11;
  79.  
  80.     place = getTextPlacement( GetTagData( NGDA_Flags, 0, de->taglist ), PLACETEXT_LEFT );
  81.     switch( place )
  82.     {
  83.     case PLACETEXT_ABOVE:
  84.         if( width < textwidth )
  85.             width = textwidth;
  86.         setMinWidth( de, width );
  87.         setMaxWidth( de, width );
  88.         setMinTopExtent( de, textheight + INTERHEIGHT );
  89.         setMaxTopExtent( de, textheight + INTERHEIGHT );
  90.         setMinBottomExtent( de, height );
  91.         setMaxBottomExtent( de, height );
  92.         break;
  93.     case PLACETEXT_BELOW:
  94.         if( width < textwidth )
  95.             width = textwidth;
  96.         setMinWidth( de, width );
  97.         setMaxWidth( de, width );
  98.         setMinBottomExtent( de, textheight + INTERHEIGHT );
  99.         setMaxBottomExtent( de, textheight + INTERHEIGHT );
  100.         setMinTopExtent( de, height );
  101.         setMaxTopExtent( de, height );
  102.         break;
  103.     case PLACETEXT_LEFT:
  104.         if( height < textheight )
  105.             height = textheight;
  106.         setMinLeftExtent( de, textwidth + INTERWIDTH  );
  107.         setMaxLeftExtent( de, textwidth + INTERWIDTH  );
  108.         setMinRightExtent( de, width );
  109.         setMaxRightExtent( de, width );
  110.         setMinHeight( de, height );
  111.         setMaxHeight( de, height );
  112.         break;
  113.     case PLACETEXT_RIGHT:
  114.         if( height < textheight )
  115.             height = textheight;
  116.         setMinLeftExtent( de, width );
  117.         setMaxLeftExtent( de, width );
  118.         setMinRightExtent( de, textwidth + INTERWIDTH  );
  119.         setMaxRightExtent( de, textwidth + INTERWIDTH  );
  120.         setMinHeight( de, height );
  121.         setMaxHeight( de, height );
  122.         break;
  123.     case PLACETEXT_IN:
  124.         if( width < textwidth )
  125.             width = textwidth;
  126.         if( height < textheight )
  127.             height = textheight;
  128.         setMinWidth( de, width );
  129.         setMaxWidth( de, width );
  130.         setMinHeight( de, height );
  131.         setMaxHeight( de, height );
  132.         break;
  133.     }
  134. }
  135.  
  136. static ULONG layoutCheckBox( DialogElement *de, LayoutMessage *lm )
  137. {
  138.     struct NewGadget ng;
  139.     ULONG error = DIALOGERR_OK;
  140.  
  141.     if( !de )
  142.         return DIALOGERR_BAD_ARGS;
  143.     if( !lm )
  144.         return DIALOGERR_BAD_ARGS;
  145.  
  146. #ifdef DEBUG1
  147.     printf(
  148.     "layoutCheckBox : x %d, y %d, width %d, height %d, left %d, right %d, top %d, bottom %d\n",
  149.         lm->lm_X, lm->lm_Y, lm->lm_Width, lm->lm_Height,
  150.         lm->lm_Left, lm->lm_Right, lm->lm_Top, lm->lm_Bottom );
  151. #endif
  152.     ng.ng_GadgetText = (UBYTE *)GetTagData( NGDA_GadgetText, 0, de->taglist );
  153.     ng.ng_TextAttr = (struct TextAttr *)GetTagData( NGDA_TextAttr, 0, de->taglist );
  154.     ng.ng_VisualInfo = (APTR)GetTagData( NGDA_VisualInfo, 0, de->taglist );
  155.     ng.ng_Flags = GetTagData( NGDA_Flags, 0, de->taglist );
  156.     ng.ng_LeftEdge = lm->lm_X;
  157.     ng.ng_TopEdge = lm->lm_Y;
  158.     switch( getTextPlacement( ng.ng_Flags, PLACETEXT_LEFT ) )
  159.     {
  160.     case PLACETEXT_RIGHT:
  161.         ng.ng_LeftEdge -= lm->lm_Left;
  162.         break;
  163.     case PLACETEXT_ABOVE:
  164.         ng.ng_LeftEdge += ( lm->lm_Width - 26 ) / 2;
  165.         break;
  166.     case PLACETEXT_BELOW:
  167.         ng.ng_LeftEdge += ( lm->lm_Width - 26 ) / 2;
  168.         ng.ng_TopEdge -= lm->lm_Top;
  169.         break;
  170.     }
  171.     de->object = CreateGadgetA( CHECKBOX_KIND, *lm->lm_PreviousPtr, &ng, de->taglist );
  172.     *lm->lm_PreviousPtr = de->object;    /* advance "previous" pointer to new object */
  173.     if( !de->object )
  174.         error = DIALOGERR_NO_MEMORY;
  175.     return error;
  176. }
  177.  
  178. static DialogElement *matchCheckBox( DialogElement *de, MatchMessage *mm )
  179. {
  180.     struct IntuiMessage *imsg;
  181.     struct TagItem *tag;
  182.     struct Gadget *gadget;
  183.     DialogElement *match = NULL;
  184.  
  185.     if( !de )
  186.         return NULL;
  187.     if( !mm )
  188.         return NULL;
  189.  
  190.     imsg = mm->mm_IntuiMsg;
  191.     switch( imsg->Class )
  192.     {
  193.     case IDCMP_GADGETUP:
  194.         if( de->object == imsg->IAddress )
  195.             match = de;
  196.         break;
  197.     case IDCMP_VANILLAKEY:
  198.         if( tag = FindTagItem( DA_EquivalentKey, de->taglist ) )
  199.             if( tolower( imsg->Code ) == tolower( tag->ti_Data ) )
  200.             {
  201.                 gadget = de->object;
  202.                 GT_SetGadgetAttrs( de->object, imsg->IDCMPWindow, NULL,
  203.                     GTCB_Checked, !( gadget->Flags & GFLG_SELECTED ),
  204.                     TAG_DONE );
  205.                 match = de;
  206.             }
  207.         break;
  208.     }
  209.     return match;
  210. }
  211.  
  212. ULONG dispatchCheckBox( struct Hook *hook, DialogElement *de, DialogMessage *dm )
  213. {
  214.     ULONG result;
  215.  
  216.     switch( dm->dm_MethodID )
  217.     {
  218.     case DIALOGM_GETSTRUCT:
  219.         result = getCheckBoxStructure( de );
  220.         break;
  221.     case DIALOGM_SETUP:
  222.         setupCheckBox( de );
  223.         break;
  224.     case DIALOGM_LAYOUT:
  225.         result = layoutCheckBox( de, (LayoutMessage *)dm );
  226.         break;
  227.     case DIALOGM_MATCH:
  228.         result = (ULONG)matchCheckBox( de, (MatchMessage *)dm );
  229.         break;
  230.     case DIALOGM_CLEAR:
  231.         break;
  232.     case DIALOGM_SETATTRS:
  233.         setGTAttrs( de, (SetAttrsMessage *)dm );
  234.         break;
  235.     }
  236.     return result;
  237. }
  238.